本文以laravel5.0.22为例。
本节以新建一个简单的博客作为实例。
准备工作
数据库配置
.env文件(也可以直接修改config/database.php)
DB_HOST=localhostDB_DATABASE=myblogDB_USERNAME=rootDB_PASSWORD=123456
数据库表:
CREATE TABLE `blog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL DEFAULT '0', `title` varchar(50) NOT NULL DEFAULT '', `content` text NOT NULL, `flag` tinyint(2) NOT NULL DEFAULT '1', `create_time` int(11) NOT NULL DEFAULT '0', `update_time` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
开始
这里暂时不使用Eloquent ORM
,直接使用DB类。
控制器
新建一个控制器:app/Http/Controllers/BlogController.php
get(); //需要return return view('blog.index', ['list' => $list]); }}
视图
新建一个母版视图:resources/views/blog/layout.blade.php
Laravel @yield('content')
新建一个普通视图:resources/views/blog/index.blade.php
@extends('blog.layout')@section('content') @foreach($list as $blog)@endforeach@endsection{ {$blog->title}}
{
{$blog->content}}
路由
基础路由:
Route::get('blog', 'BlogController@index');Route::get('blog/info', 'BlogController@info'); //get请求Route::post('blog/info', 'BlogController@info'); //post请求Route::any('blog/info', 'BlogController@info'); //'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'请求均可Route::match(['get', 'post'], 'blog/info', 'BlogController@info'); //'get', 'post'请求Route::get('blog', ['uses' => 'BlogController@index']);Route::get('blog/info/{id}', ['uses' => 'BlogController@info'])->where('id', '[0-9]+'); //匹配正则Route::get('blog/tag/{name}', ['uses' => 'BlogController@tag'])->where('name', '\w+');
访问
http://localhost/laravel5/public/index.php/blog
即可。
隐式控制器路由
注意:laravel5.2已废弃该方法。
默认的,每新增一个方法,需要写一条路由,比较繁琐。Laravel支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是:
1) 方法的名称应由它们所响应的 HTTP 动词作为开头,紧跟着首字母大写的 URI 所组成:控制器里方法必须以get
、post
开头 2) Route::get()
改成Route::controller()
。 示例:上面的index
方法我们需要改成getIndex
,路由这样写:
Route::controller('blog', 'BlogController');
这样,Blog
控制器所有的方法都能被路由匹配。例如,有如下方法:
public function getIndex(){}public function getDetail(){}public function postAdd(){}
都可以被匹配。访问的时候直接:
http://localhost/laravel5/public/index.php/blog/indexhttp://localhost/laravel5/public/index.php/blog/detail/2http://localhost/laravel5/public/index.php/blog/add
路由组:
Route::controllers([ 'blog' => 'BlogController', 'user' => 'UserController']);
资源控制器路由
资源控制器会创建多个路由,用来处理各式各样和相片资源相关的的 RESTful 行为。例如:Route::resource('photos', 'PhotosController');
该路由会根据HTTP动作及路径自动对应方法名:
动词 路径 行为(方法) 路由名称GET /photos index photos.indexGET /photos/create create photos.createPOST /photos store photos.storeGET /photos/{photo} show photos.showGET /photos/{photo}/edit edit photos.editPUT/PATCH /photos/{photo} update photos.updateDELETE /photos/{photo} destroy photos.destroy
声明资源路由时,你可以指定让此路由仅处理一部分的行为:
Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);Route::resource('photos', 'PhotosController', ['except' => ['create', 'store', 'update', 'destroy']]);
路由组
Route::group(['prefix'=>'admin','middleware'=>'auth'],function(){ Route::any('/','backend\HomeController@index'); Route::resource('home', 'backend\HomeController'); Route::resource('cate','backend\CateController'); Route::controllers([ 'system'=>'backend\SystemController', 'upload'=>'backend\UploadFileController' ]);});
该路由组前缀是admin,及url里admin开头的都会调用该路由组。使用了中间件auth进行验证身份。
新增文章详情页
控制器新增getDetail()
方法:
public function getDetail($id) { $blog = DB::table('blog')->find($id); return view('blog.detail', ['blog' => $blog]);}
更改index.blade.php
:
@extends('blog.layout')@section('content') @foreach($list as $blog)@endforeach @endsection{ {$blog->title}}
{
{$blog->content}}
新增文章详情视图页blog/detail.blade.php
:
@extends('blog.layout')@section('content')@endsection{ {$blog->title}}
{
{$blog->content}}
更改路由:
//对应blog/indexRoute::get('blog', 'BlogController@index'); //对应blog里任何方法,注意方法要加get或者postRoute::controller('blog', 'BlogController');
使用Eloquent ORM
上面我们一直用的是DB类。接下来我们将使用Eloquent ORM代替DB类。
Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动。 每个数据库表对应一个模型文件。
模型(Model)
在app
下新建Blog.php
:
提示:所有DB类里查询构造器
里的方法,查询 Eloquent 模型时也可以使用。
控制器里使用模型
复制BlogController.php
为BlogController.php.bak
,清空原BlogController.php
里面内容,改为如下内容:
$list]); } public function getDetail($id) { $blog = Blog::find($id); return view('blog.detail', ['blog' => $blog]); }}
Eloquent ORM提供了很多易用的方法来操作数据库。例如:
在Blog.php
模型文件里,我们可以使用以下查询方法(Eloquent ORM同时支持$this
和静态方式
调用):
//取出所有记录,all()得出的是对象集合,可以遍历$this->all()->toArray();//根据主键取出一条数据$one = $this->find('2');return array( $one->id, $one->title, $one->content,);//查找id=2的第一条数据$this->where('id', 2)->first()->toArray();//查找id>0的所有数据$this->where('id', '>', '0')->get()->toArray();//查找id>0的所有数据,降序排列$this->where('id', '>', '0')->orderBy('id', 'desc')->get()->toArray();//查找id>0的所有数据,降序排列,计数$this->where('id', '>', '0')->orderBy('id', 'desc')->count();//offset,limit$this->where('id', '>', '0')->orderBy($order[0], $order[1])->skip($offset)->take($limit);//等同于$this->where('id', '>', '0')->orderBy($order[0], $order[1])->offset($offset)->limit($limit);
更多操作方法详见:http://www.golaravel.com/laravel/docs/5.0/eloquent/
访问http://localhost/laravel5/public/index.php/blog
页面看看吧!
新增博客
建立新视图:blog/add.blade.php
:
@extends('blog.layout')@section('content')@endsection新增博客@if (count($errors) > 0)输入不正确! 输入的格式不正确!@endif@foreach ($errors->all() as $error)
- { { $error }}
@endforeach
在首页blog/layout.blade.php
新增一个新增
按钮:
Laravel @yield('content')
控制器新增:
/*** 显示新增页面*/public function getAdd() { return view('blog.add');}/*** 执行新增动作*/public function postAdd(Request $request) { //执行表单验证 http://laravel-china.org/docs/5.0/validation $this->validate($request, [ 'title' => 'required|max:255', 'content' => 'required', ]); //如何获取post过来的title和content等字段信息? //方法一:使用传统方法 // $data = $_POST; //方法二:通过 Facade Request。必须导入 Illuminate\Support\Facades\Request // $title = \Illuminate\Support\Facades\Request::input('title'); //方法三:依赖注入,需导入Illuminate\Http\Request // $data = $request->all(); // $title = $request->input('title'); //或者: // $title = $request->title; //方法四:使用Facade Input。必须导入 Illuminate\Support\Facades\Input // $data = Input::get(); $blog = new Blog; $blog->title = Input::get('title'); $blog->content = Input::get('content'); $blog->uid = 1; //保存数据 if ($blog->save()) { //重定向,需要先导入Illuminate\Support\Facades\Redirect return Redirect::to('blog'); } else { return Redirect::back()->withInput()->withErrors('保存失败!'); }}
点击新增
按钮,就可以新增一篇博客了!
在上面代码里面,演示了多种途径获得post过来的数据,大家可以一一尝试。
小技巧:可以使用dd()
、var_dump()
方法打印。
输出json
1、建立 JSON 响应
json 方法会自动将响应头的 Content-Type 配置为 application/json:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
2、建立 JSONP 响应#
return response()->json(['name' => 'Abigail', 'state' => 'CA']) ->setCallback($request->input('callback'));
这里用到了Laravel的下列知识点:
- 表单验证:http://laravel-china.org/docs/5.0/validation
- 请求:http://laravel-china.org/docs/5.0/requests
- Facades:http://laravel-china.org/docs/5.0/facades
- 响应http://laravel-china.org/docs/5.0/responses
辅助工具
给IDE添加智能提示
Laravel里很多类没有提示,如Route类。 扩展包能让你的 IDE ( PHPStorm, Sublime ) 实现自动完成、代码智能提示和代码跟踪等功能,大大提高你的开发效率。
安装
1)使用 Composer 安装该扩展包:
composer require barryvdh/laravel-ide-helper
2)安装完成后,在 config/app.php
添加以下内容到 providers 数组。
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
3)接下来运行以下命令生成代码对应文档:
php artisan ide-helper:generate
由于使用此扩展包会生成相应的代码结构文件, 这些文件可能只有当前的开发者的 IDE 需要, 因此需要添加对应配置到.gitignore
文件中:
.idea_ide_helper.php
到此,此拓展包即安装成功。
页面调试工具栏
用于直观的显示调试及错误信息,提高开发效率。
安装
1)使用 Composer 安装该扩展包:
composer require barryvdh/laravel-debugbar
2)安装完成后,修改 config/app.php 在 providers 数组内追加 Debugbar 的 Provider
'providers' => [ Barryvdh\Debugbar\ServiceProvider::class,],
同时在 aliases 数组内追加如下内容
'aliases' => [ 'Debugbar' => Barryvdh\Debugbar\Facade::class,]
3)接下来运行以下命令生成此扩展包的配置文件 config/debugbar.php:
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
打开 config/debugbar.php
,将 enabled 的值设置为:
'enabled' => env('APP_DEBUG', false),
修改完以后, Debugbar 分析器的启动状态将由 .env
文件中 APP_DEBUG
值决定。
页面刷新后, 看到下图即表示运行成功。
更多:
summerblue/laravel-package-top-100: https://github.com/summerblue/laravel-package-top-100